package common

import (
	"fmt"
	"github.com/hashicorp/go-uuid"
	"net"
	"strings"
)

// 判断是否为局域网 IP（IPv4 私有地址 + IPv6 唯一本地地址）
func isPrivateIP(ip net.IP) bool {
	if ip.IsLoopback() || ip.IsLinkLocalUnicast() || ip.IsLinkLocalMulticast() {
		return false
	}

	// 检查 IPv4 私有地址
	if ip.To4() != nil {
		return ip.IsPrivate()
	}

	// 检查 IPv6 唯一本地地址 (ULA, fc00::/7)
	return ip.IsPrivate()
}

func GetMACByName(interfaceName string) (string, error) {
	// 获取所有网络接口
	interfaces, err := net.Interfaces()
	if err != nil {
		return "", fmt.Errorf("获取网络接口失败: %v", err)
	}

	// 遍历查找目标网卡
	for _, iface := range interfaces {
		if iface.Name == interfaceName {
			if iface.HardwareAddr == nil {
				return "", fmt.Errorf("网卡 %s 无 MAC 地址", interfaceName)
			}

			return iface.HardwareAddr.String(), nil
		}
	}

	return "", fmt.Errorf("未找到网卡: %s", interfaceName)
}

func GetAllMac() ([]string, error) {
	// 获取所有网络接口
	interfaces, err := net.Interfaces()
	if err != nil {
		return nil, fmt.Errorf("获取网络接口失败: %v", err)
	}

	ret := make([]string, 0, len(interfaces))
	// 遍历查找目标网卡
	for _, iface := range interfaces {
		// 查找目标网卡

		// 检查 MAC 地址是否存在
		if iface.HardwareAddr == nil {
			continue
		}
		// 获取网卡的所有 IP 地址
		addrs, err := iface.Addrs()
		if err != nil {
			continue
		}

		// 检查是否存在局域网 IP
		for _, addr := range addrs {
			ipNet, ok := addr.(*net.IPNet)
			if !ok {
				continue
			}

			ip := ipNet.IP
			if isPrivateIP(ip) {
				ret = append(ret, iface.HardwareAddr.String())
			}
		}

	}

	return ret, nil
}

func GetPureUuid() string {
	uuid, _ := uuid.GenerateUUID()
	return strings.Replace(uuid, "-", "", -1)
}

func BlockingWrite(conn net.Conn, data []byte) (int, error) {
	total := 0
	for total < len(data) {
		n, err := conn.Write(data[total:])
		if n > 0 {
			total += n
		}
		if err != nil {
			return total, err // 返回已写入字节数和错误
		}
	}
	return total, nil
}
